<?php

class Academico_UsuarioController extends Zend_Controller_Action {

    private $debugLog;

    public function init() {
        $this->debugLog = Zend_Registry::get(VirtualLabs_Common::DEBUG_LOG);
    }

    public function preDispatch() {
        // Autenticacion del usuario
        $auth = Zend_Auth::getInstance();
        if (!$auth->hasIdentity()) {
            $this->_helper->layout->disableLayout();
            $this->_forward("index", "index", "");
        } else {
            $identity = $auth->getIdentity();
            if ($identity['tipo_usuario'] == VirtualLabs_Admin_Usuario::ROL_ADMIN) {
                $this->_helper->layout->disableLayout();
                $this->_redirect('/');
            }
        }
        //fin de la autenicacion del usuario
    }

    public function indexAction() {
        $this->forward("myaccount", "usuario", "academico");
    }

    public function viewAction() {
        $userDao = new VirtualLabs_Admin_Usuario();
        $username = $this->getRequest()->getParam('username');
        $user = $userDao->getUsuario(array('nombre', 'apellido', 'username', 'email'), array('username' => array('criteria' => '=', 'value' => $username)));
        if ($user) {
            $this->view->nombre = $user['nombre'];
            $this->view->apellido = $user['apellido'];
            $this->view->username = $user['username'];
            $this->view->email = $user['email'];
        }
    }

    public function myaccountAction() {
        $userDao = new VirtualLabs_Admin_Usuario();
        $userLoggedIn = Zend_Auth::getInstance()->getIdentity();
        $user = $userDao->getUsuario(array('nombre', 'apellido', 'username', 'email'), array('email' => array('criteria' => '=', 'value' => $userLoggedIn['email'])));
        if ($user) {
            $this->view->nombre = $user['nombre'];
            $this->view->apellido = $user['apellido'];
            $this->view->username = $user['username'];
            $this->view->email = $user['email'];
        }
    }

    public function savemyaccountAction() {
        $this->_helper->layout->disableLayout();
        $this->_helper->viewRenderer->setNoRender(true);
        $userDao = new VirtualLabs_Admin_Dao();
        try {
            if ($this->getRequest()->getParam('password')) {
                $userDao->save(VirtualLabs_Admin_Usuario::TABLE_NAME, array(
                    'apellido' => $this->getRequest()->getParam('apellido'),
                    'email' => $this->getRequest()->getParam('email'),
                    'nombre' => $this->getRequest()->getParam('nombre'),
                    'passw' => $this->getRequest()->getParam('password')), array('key' => 'email', 'value' => $this->getRequest()->getParam('email')));
            } else {
                $userDao->save(VirtualLabs_Admin_Usuario::TABLE_NAME, array(
                    'apellido' => $this->getRequest()->getParam('apellido'),
                    'email' => $this->getRequest()->getParam('email'),
                    'nombre' => $this->getRequest()->getParam('nombre')), array('key' => 'email', 'value' => $this->getRequest()->getParam('email')));
            }
            echo Zend_Json_Encoder::encode(array("response" => "success"));
        } catch (Exception $e) {
            $this->debugLog->debug($e->getTraceAsString());
            echo Zend_Json_Encoder::encode(array("response" => "error"));
        }
    }

    public function matriculacionAction() {
        
    }

    public function listlabbymatAction() {
        $this->_helper->layout->disableLayout();
        $this->_helper->viewRenderer->setNoRender(true);

        $cod_matricula = $this->getRequest()->getParam('codigo');
        $retval = array();
        $aaData = array();

        try {
            $labDao = new VirtualLabs_Academico_Laboratorio();

            $labDB = $labDao->getLabByCodMatricula($cod_matricula);
            $debugLog = Zend_Registry::get(VirtualLabs_Common::DEBUG_LOG);
            $debugLog->debug("Datos Laboratorio: " . print_r($labDB, TRUE));
            if (count($labDB) > 0) {
                //Obtenemos el username 
                $userLoggedIn = Zend_Auth::getInstance()->getIdentity();
                $username = $userLoggedIn['username'];
                $usernameTipo = $userLoggedIn['tipo_usuario'];
                //Verificamos si existe un laboratorio asociado a este username
                $labUser = $labDao->getLabsByUsernameAndCodLab($username, $labDB[0]['codigo_laboratorio']);
                $debugLog->debug("Lab User: " . print_r($labUser, TRUE));
                if (count($labUser) > 0 && $usernameTipo == VirtualLabs_Admin_Usuario::ROL_ALUMNO) {
                    $retval[] = array(
                        "<div class='col-xs-12 col-sm-12 col-md-12'>" .
                        "El alumno ya se encuentra matriculado en el curso" .
                        "</div>"
                    );
                } else {
                    foreach ($labDB as $lab) {
                        $profesores = $labDao->getProfesoresByLab($lab['codigo_laboratorio']);
                        $prof_text = "Profesores:<br><ul class=''>";
                        foreach ($profesores as $profesor) {
                            $prof_text .= "<li class='text-info'>{$profesor['nombre']}</li>";
                        }
                        $prof_text .= "</ul>";

                        $retval[] = array(
                            "<div class='col-xs-12 col-sm-12 col-md-2'>" .
                            "<img src='/images/lab-net.jpg' style='width: 90px; height: 90px;'>" .
                            "</div>" .
                            "<div class='col-xs-12 col-sm-12 col-md-4'>" .
                            "Laboratorio: {$lab['nombre_mostrar']}" . "<br>" .
                            "A. Academica: " . "<br>" .
                            $prof_text .
                            "</div>" .
                            "<div class='col-xs-12 col-sm-12 col-md-4'>" .
                            'Desde: ' . $lab['fecha_inicio'] . "<br>" .
                            'Hasta: ' . $lab['fecha_fin'] . "<br>" .
                            'Dias: ' . $lab['dias_encendido'] . "<br>" .
                            'De: ' . $lab['hora_inicio_dia'] . ' A: ' . $lab['hora_fin_dia'] .
                            "</div>" .
                            "<div class='col-xs-12 col-sm-12 col-md-2'>" .
                            "<div class='text-center'>" .
                            "<a id='btnaplicar' href='#' class='btn btn-primary btn-block' role='button' onclick='matricular({$lab['codigo_laboratorio']});'>Matricularse</a>" .
                            "</div>" .
                            "</div>"
                        );
                    }
                }
            } else {
                $retval[] = array(
                    "<div class='col-xs-12 col-sm-12 col-md-12'>" .
                    "No se encontraron resultados" .
                    "</div>"
                );
            }
        } catch (Exception $exc) {
            $debugLog = Zend_Registry::get(VirtualLabs_Common::DEBUG_LOG);
            $debugLog->debug($exc->getMessage());
            $debugLog->debug($exc->getTraceAsString());
            return;
        }
        $aaData['aaData'] = $retval;
        echo Zend_Json_Encoder::encode($aaData);
    }

    public function listlabbymat2Action() {
        $this->_helper->layout->disableLayout();
        $this->_helper->viewRenderer->setNoRender(true);
        $retval = "";

        try {
            $codigo_matricula = $this->getRequest()->getParam('codigo');
            $userLoggedIn = Zend_Auth::getInstance()->getIdentity();
            $username = $userLoggedIn['username'];
            $usernameTipo = $userLoggedIn['tipo_usuario'];

            //dependiendo del tipo de alumno listamos
            if ($usernameTipo == VirtualLabs_Admin_Usuario::ROL_ALUMNO) {
                $retval = $this->getLaboratorioByMatAlumno($codigo_matricula, $username);
            } elseif ($usernameTipo == VirtualLabs_Admin_Usuario::ROL_PROFESOR) {
                $this->debugLog->debug("[profesor] $username");
                $retval = $this->getLaboratorioByMatProfesor($codigo_matricula, $username);
            }
//            $aaData['aaData'] = $retval;
//            echo Zend_Json_Encoder::encode($aaData);
            echo $retval;
        } catch (Exception $exc) {
            $debugLog = Zend_Registry::get(VirtualLabs_Common::DEBUG_LOG);
            $debugLog->debug($exc->getMessage());
            $debugLog->debug($exc->getTraceAsString());
            return;
        }
    }

    /**
     * 
     * @param type $codigo_matricula
     * @param type $username
     * @return string
     * @throws Exception
     */
    private function getLaboratorioByMatAlumno($codigo_matricula, $username) {
        try {
            //obtenemos el codigo de labboratorio que coincide con la matricula            
            $labDao = new VirtualLabs_Academico_Laboratorio();
            $labDB = $labDao->getLabByCodMatricula($codigo_matricula);
            if (count($labDB) > 0) {
                $labUser = $labDao->getLabsByUsernameAndCodLab($username, $labDB[0]['codigo_laboratorio']);

                if (count($labUser) > 0) { // Si esta condicion se cumple es porque el alumno ya esta asociado al laboratorio, por ende ya esta matriculado
                    $retval.= (
                            "<div class='row'><div class='col-xs-12 col-sm-12 col-md-12'>" .
                            "El alumno ya se encuentra matriculado en el curso" .
                            "</div></div>"
                            );
                } else {
                    //sino, iteramos sobre el laboratorio y mostramos los datos
                    foreach ($labDB as $lab) {
                        $profesores = $labDao->getProfesoresByLab($lab['codigo_laboratorio']);
                        $prof_text = "Profesores:<br><ul class=''>";
                        foreach ($profesores as $profesor) {
                            $prof_text .= "<li class='text-info'>{$profesor['nombre']}</li>";
                        }
                        $prof_text .= "</ul>";
                        $retval.= (
                                "<div class='row'><div class='col-xs-12 col-sm-12 col-md-2'>" .
                                "<img src='/images/lab-net.jpg' style='width: 90px; height: 90px;'>" .
                                "</div>" .
                                "<div class='col-xs-12 col-sm-12 col-md-4'>" .
                                "Laboratorio: {$lab['nombre_mostrar']}" . "<br>" .
                                "A. Academica: " . "<br>" .
                                $prof_text .
                                "</div>" .
                                "<div class='col-xs-12 col-sm-12 col-md-4'>" .
                                'Desde: ' . $lab['fecha_inicio'] . "<br>" .
                                'Hasta: ' . $lab['fecha_fin'] . "<br>" .
                                'Dias: ' . $lab['dias_encendido'] . "<br>" .
                                'De: ' . $lab['hora_inicio_dia'] . ' A: ' . $lab['hora_fin_dia'] .
                                "</div>" .
                                "<div class='col-xs-12 col-sm-12 col-md-2'>" .
                                "<div class='text-center'>" .
                                "<a id='btnaplicar' href='#' class='btn btn-primary btn-block' role='button' onclick='matricular({$lab['codigo_laboratorio']});'>Matricularse</a>" .
                                "</div>" .
                                "</div></div>"
                                );
                    }
                }
            } else {
                $retval.= (
                        "<div class='row'><div class='col-xs-12 col-sm-12 col-md-12'>" .
                        "No existe ningun laboratorio asociado al codigo de matricula {$codigo_matricula}" .
                        "</div></div>"
                        );
            }
            return $retval;
        } catch (Exception $exc) {
            throw $exc;
        }
    }

    private function getLaboratorioByMatProfesor($codigo_matricula, $username) {
        try {
            $labDao = new VirtualLabs_Academico_Laboratorio();
            $labDB = $labDao->getLabByCodMatricula($codigo_matricula);
            if (!empty($labDB)) {
                //El profesor de por si ya se encuentra asociado al laboratorio, en caso de no estarlo, no puede 
                //"matricularse" al mismo
                $labUser = $labDao->getLabsByUsernameAndCodLab($username, $labDB[0]['codigo_laboratorio']);
                if (count($labUser) > 0) {
                    // Esta condicion debe cumplirse para que el profesor pueda crear las vm
                    // En caso de que las vms ya se encuentren creadas, las mismas deben asociarse al profesor
                    $grupoPerfilDao = new VirtualLabs_Admin_GrupoPerfil();
                    $vmDao = new VirtualLabs_Admin_Machine();
                    $vmDaoAcademico = new VirtualLabs_Academico_Machine();
                    foreach ($labDB as $lab) {
                        // Verificamos los grupos de perfiles asociados al laboratorio y que sean no asignables
                        // La condicion de No asignable del perfil de una VM permite asociar esta VM al profesor                        
                        $perfiles = $grupoPerfilDao->getPerfilesByCodLaboratorio($lab['codigo_laboratorio']);
                        // Si el resultado de este query es mayor a 0, el mismo indica que hay perfiles asociables
                        // a un profesor, en caso de no ser asi, no tiene razon de ser la "matriculacion del profesor
                        // al laboratorio
                        $debugLog = Zend_Registry::get(VirtualLabs_Common::DEBUG_LOG);
                        //$debugLog->debug("perfiles : " . print_r($perfiles,TRUE));


                        if (!empty($perfiles)) {
                            foreach ($perfiles as $perfil) {
                                $vms = $vmDao->getVirtualMachines(array('*'), array(
                                    "codigo_laboratorio" => array('criteria' => '=', 'value' => $lab['codigo_laboratorio']),
                                    "codigo_perfil_vm" => array('criteria' => '=', 'value' => $perfil['codigo_perfil_vm']))
                                );
                                if (!empty($vms)) {
                                    //asociar al profesor la VM 
                                    foreach ($vms as $vm) {
                                        try {
                                            if (!($vmDaoAcademico->isUserVm($username, $vm['codigo_maquina_virtual']))) {
                                                $vmDao->insertMiembroAsociado($vm['codigo_maquina_virtual'], $username);
                                            }
                                        } catch (Exception $exc) {
                                            
                                        }
                                    }
                                } else {
                                    $retval .= (
                                            "<div class='row'><div class='col-xs-12 col-sm-12 col-md-2'>" .
                                            "<img src='/images/lab-net.jpg' style='width: 90px; height: 90px;'>" .
                                            "</div>" .
                                            "<div class='col-xs-12 col-sm-12 col-md-4'>" .
                                            "Laboratorio: {$lab['nombre_mostrar']}" . "<br>" .
                                            "A. Academica: " . "<br>" .
                                            "</div>" .
                                            "<div class='col-xs-12 col-sm-12 col-md-4'>" .
                                            'Desde: ' . $lab['fecha_inicio'] . "<br>" .
                                            'Hasta: ' . $lab['fecha_fin'] . "<br>" .
                                            'Dias: ' . $lab['dias_encendido'] . "<br>" .
                                            'De: ' . $lab['hora_inicio_dia'] . ' A: ' . $lab['hora_fin_dia'] .
                                            "</div>" .
                                            "<div class='col-xs-12 col-sm-12 col-md-2'>" .
                                            "<div class='text-center'>" .
                                            "<a id='btnaplicar' href='#' class='btn btn-primary btn-block' role='button' onclick='crear({$lab['codigo_laboratorio']});'>Crear VMS</a>" .
                                            "</div>" .
                                            "</div></div>"
                                            );
                                    return $retval;
                                }
                            }
                            $retval.= (
                                    "<div class='row'><div class='col-xs-12 col-sm-12 col-md-12'>" .
                                    "Las M&aacute;quinas Virtuales de este laboratorio est&aacute;n creadas, se realiz&oacute; la asociaci&oacute;n al profesor" .
                                    "</div></div>"
                                    );
                        } else {
                            $retval.= (
                                    "<div class='row'><div class='col-xs-12 col-sm-12 col-md-12'>" .
                                    "No existen maquinas virtuales asignables al profesor" .
                                    "</div></div>"
                                    );
                        }
                    }
                } else {
                    $retval.= (
                            "<div class='row'><div class='col-xs-12 col-sm-12 col-md-12'>" .
                            "El profesor no pertenece a este laboratorio" .
                            "</div></div>"
                            );
                }
            } else {
                $retval.= (
                        "<div class='row'><div class='col-xs-12 col-sm-12 col-md-12'>" .
                        "No existe ningun laboratorio asociado al codigo de matricula {$codigo_matricula}" .
                        "</div></div>"
                        );
            }
            return $retval;
        } catch (Exception $exc) {
            throw $exc;
        }
    }

    /**
     *  Proceso fundamental a la hora de creacion de las maquinas virtuales.
     */
    public function matricularAction() {
        $this->_helper->layout->disableLayout();
        $this->_helper->viewRenderer->setNoRender(true);
        $debugLog = Zend_Registry::get(VirtualLabs_Common::DEBUG_LOG);
        $retval = array();
        try {
            // Obtenemos el codigo de laboratorio del request
            $codigoLaboratorio = $this->getRequest()->getParam('codigo_laboratorio');
            //Obtenemos el username y el tipo de usuario (profesor o alumno)
            $userLoggedIn = Zend_Auth::getInstance()->getIdentity();
            $username = $userLoggedIn['username'];
            $usernameTipo = $userLoggedIn['tipo_usuario'];
            //obtenemos y validamos datos del laboratorio. Nos interesa principalmente el ProjectID para crear el laboratorio.
            $labDao = new VirtualLabs_Admin_Laboratorio();
            $laboratorio = $labDao->getLaboratorio(array('*'), array("codigo_laboratorio" => array('criteria' => '=', 'value' => $codigoLaboratorio),
                "estado" => array('criteria' => '=', 'value' => VirtualLabs_Academico_Laboratorio::ACTIVO)));
            // Se realizan las comprobaciones
            // Si el laboratorio al que se quiere matricular no existe
            if (empty($laboratorio)) {
                $retval['response'] = "error";
                $retval['message'] = "El laboratorio no existe o no es v&aacute;lido";
                echo Zend_Json_Encoder::encode($retval);
                return;
            }
            // Si el alumno ya se encuentra matriculado
            if ($labDao->isMemberInLab($username, $codigoLaboratorio)) {
                $retval['response'] = "error";
                $retval['message'] = "El alumno ya se encuentra matriculado en el curso";
                echo Zend_Json_Encoder::encode($retval);
                return;
            }
            //obtenemos la(s) cabecera(s) de grupo_perfil_vm ademas de controlar el tipo de usuario.
            $grupoPerfilDao = new VirtualLabs_Admin_GrupoPerfil();
            $grupoPerfiles = $grupoPerfilDao->getGrupoPerfil(array('*'), array("codigo_laboratorio" => array('criteria' => '=', 'value' => $codigoLaboratorio),
                "asignable" => array('criteria' => '=', 'value' => VirtualLabs_Admin_GrupoPerfil::GRUPO_ASIGNABLE)));
            //Verificamos si el existen grupos de perfiles para ese laboratorio asignables a los alumnos
            if (empty($grupoPerfiles)) {
                $retval['response'] = "error";
                $retval['message'] = "No hay un perfil de m&aacute;quinas virtuales asignables al usuario";
                echo Zend_Json_Encoder::encode($retval);
                return;
            }

            //Verificamos si el laboratorio esta vigente
            $fecha_actual = strtotime(date("Y-m-d"));
            $fecha_ini = strtotime($laboratorio['fecha_inicio']);
            $fecha_fin = strtotime($laboratorio['fecha_fin']);
            if (($fecha_actual >= $fecha_ini) && ($fecha_fin >= $fecha_actual)) {
                $projectId = $laboratorio['codigo_proyecto'];
                $vmDao = new VirtualLabs_Admin_Machine();
                // De acuerdo al grupo_perfil_vm se determina primero 
                // si ya se crearon la cantidad suficiente de grupos cantidad_creada < cantidad
                // Luego se debe crear una maquina virtual por cada miembro del perfil_vm perteneciente
                // al grupo_perfil_vm            
                foreach ($grupoPerfiles as $grupoPerfil) {
                    if ($grupoPerfil['cantidad_creada'] < $grupoPerfil['cantidad']) {
                        $vmRest = new VirtualLabs_Rest_VirtualLabs_VirtualMachine();
                        $perfiles = $grupoPerfilDao->getPerfiles2(array('*'), array("codigo_grupo_perfil_vm" => array('criteria' => '=', 'value' => $grupoPerfil['codigo_grupo_perfil_vm'])));
                        //por cada perfil se debe crear una VM y asignar al usuario
                        $i = 1;
                        foreach ($perfiles as $perfil) {
                            $serviceOffering = $perfil['service_offering'];
                            $diskOffering = $perfil['disk_offering'];
                            $template = $perfil['template'];
                            $labName = str_replace(" ", "", strtolower($laboratorio["nombre"]));
                            $vmName = "vm-" . $labName . "-" . $username . "-" . $i++;
                            try {
                                $response = $vmRest->createVM($serviceOffering, $diskOffering, $vmName, $template, $projectId);
                                $response_array = Zend_Json_Decoder::decode($response);
                                if (isset($response_array['deployvirtualmachineresponse']['errorcode'])) {
                                    $retval['response'] = "error";
                                    $retval['message'] = $response_array['deployvirtualmachineresponse']['errortext'];
                                    echo Zend_Json_Encoder::encode($retval);
                                    return;
                                }
                            } catch (Exception $exc) {
                                $debugLog = Zend_Registry::get(VirtualLabs_Common::DEBUG_LOG);
                                $debugLog->debug($exc->getMessage());
                                $debugLog->debug($exc->getTraceAsString());
                                $pos = strpos($exc->getMessage(), '10061');
                                if ($pos) {
                                    $retval['response'] = "error";
                                    $retval['message'] = "No es posible conectarse al controlador de la infraestructura";
                                    echo Zend_Json_Encoder::encode($retval);
                                    return;
                                }
                            }
                            //Guardamos la VM en la Base de datos
                            $savedData = $vmDao->save(VirtualLabs_Admin_Machine::TABLE_NAME, array("codigo_laboratorio" => $codigoLaboratorio,
                                "codigo_perfil_vm" => $perfil['codigo_perfil_vm'],
                                "async_job_id" => $response_array['deployvirtualmachineresponse']['jobid'],
                                "url" => "nada",
                                "estado" => VirtualLabs_Admin_Machine::ESTADO_CREACION)
                            );
                            $codigo_maquina_virtual = end($savedData);
                            //Asociamos la VM al usuario
                            $vmDao->insertMiembroAsociado($codigo_maquina_virtual, $username);
                        }
                        //Aumentamos en uno el perfil creado
                        $grupoPerfilDao->save(
                                VirtualLabs_Admin_GrupoPerfil::TABLE_NAME, array('cantidad_creada' => ($grupoPerfil['cantidad_creada'] + 1)), array('key' => 'codigo_grupo_perfil_vm', 'value' => $grupoPerfil['codigo_grupo_perfil_vm'])
                        );
                    } else {
                        $retval['response'] = "error";
                        $retval['message'] = "No se pueden crear m&aacute;s m&aacute;quinas virtuales en el laboratorio. Cupo lleno.";
                        echo Zend_Json_Encoder::encode($retval);
                        return;
                    }
                }
                $labDao->agregarMiembro(array("username" => $username, "rol" => $usernameTipo), $codigoLaboratorio);
                $retval['response'] = 'success';
                $retval['message'] = 'Se crearon m&aacute;quinas virtuales asociadas al laboratorio: <strong>' . $laboratorio["nombre"] . '</strong>';
            } else {
                $retval['response'] = "error";
                $retval['message'] = "La fecha actual no se encuentra en el periodo de validez del laboratorio.";
            }
        } catch (Exception $exc) {
            $debugLog = Zend_Registry::get(VirtualLabs_Common::DEBUG_LOG);
            $debugLog->debug($exc->getMessage());
            $debugLog->debug($exc->getTraceAsString());
            $retval['response'] = "error";
            $retval['message'] = $exc->getMessage();
        }
        echo Zend_Json_Encoder::encode($retval);
    }

    /**
     * 
     */
    public function crearvmAction() {
        $this->_helper->layout->disableLayout();
        $this->_helper->viewRenderer->setNoRender(true);
        $debugLog = Zend_Registry::get(VirtualLabs_Common::DEBUG_LOG);
        $retval = array();
        try {
            // Obtenemos el codigo de laboratorio del request
            $codigoLaboratorio = $this->getRequest()->getParam('codigo_laboratorio');
            //Obtenemos el username y el tipo de usuario (profesor o alumno)
            $userLoggedIn = Zend_Auth::getInstance()->getIdentity();
            $username = $userLoggedIn['username'];
            //obtenemos y validamos datos del laboratorio. Nos interesa principalmente el ProjectID para crear el laboratorio.
            $labDao = new VirtualLabs_Admin_Laboratorio();
            $laboratorio = $labDao->getLaboratorio(array('*'), array("codigo_laboratorio" => array('criteria' => '=', 'value' => $codigoLaboratorio),
                "estado" => array('criteria' => '=', 'value' => VirtualLabs_Academico_Laboratorio::ACTIVO)));
            // Se realizan las comprobaciones
            // Si el laboratorio al que se quiere matricular no existe
            if (empty($laboratorio)) {
                $retval['response'] = "error";
                $retval['message'] = "El laboratorio no existe o no es v&aacute;lido";
                echo Zend_Json_Encoder::encode($retval);
                return;
            }
            $projectId = $laboratorio['codigo_proyecto'];
            //obtenemos la(s) cabecera(s) de grupo_perfil_vm no asignables a alumnos, solo a profesores
            $grupoPerfilDao = new VirtualLabs_Admin_GrupoPerfil();
            $grupoPerfiles = $grupoPerfilDao->getGrupoPerfil(array('*'), array("codigo_laboratorio" => array('criteria' => '=', 'value' => $codigoLaboratorio),
                "asignable" => array('criteria' => '=', 'value' => VirtualLabs_Admin_GrupoPerfil::GRUPO_NOASIGNABLE)));
            //Verificamos si el existen grupos de perfiles para ese laboratorio asignables a los alumnos
            if (empty($grupoPerfiles)) {
                $retval['response'] = "error";
                $retval['message'] = "No hay un perfil de m&aacute;quinas virtuales asignables al profesor";
                echo Zend_Json_Encoder::encode($retval);
                return;
            }
            //Verificamos si el laboratorio esta vigente
            $fecha_actual = strtotime(date("Y-m-d"));
            $fecha_ini = strtotime($laboratorio['fecha_inicio']);
            $fecha_fin = strtotime($laboratorio['fecha_fin']);
            if (($fecha_actual >= $fecha_ini) && ($fecha_fin >= $fecha_actual)) {
                //Buscamos VM que no estan creadas y necesitamos crear para los profesores
                $gruposPerfil = $grupoPerfilDao->getGrupoPerfilByCodigoLabAsig($codigoLaboratorio, 0);
                //Si el resultado de este query es mayor a 0, el mismo indica que hay perfiles asociables
                // a un profesor, en caso de no ser asi, no tiene razon de ser la "matriculacion del profesor
                // al laboratorio                                
                $debugLog->debug("Grupos perfiles: " . print_r($gruposPerfil, TRUE));
                if (!empty($gruposPerfil)) {
                    $vmRest = new VirtualLabs_Rest_VirtualLabs_VirtualMachine();
                    $vmDao = new VirtualLabs_Admin_Machine();
                    $vmDaoAcademico = new VirtualLabs_Academico_Machine();
                    foreach ($gruposPerfil as $gp) {
                        $cantidad_creada = $gp['cantidad_creada'];
                        $perfiles = $grupoPerfilDao->getPerfiles($gp['codigo_grupo_perfil_vm']);
                        $debugLog->debug("Perfiles: " . print_r($perfiles, TRUE));
                        foreach ($perfiles as $perfil) {
                            // Verificamos si existen algunas VM con el codigo de perfil, 
                            // en caso de existir, asociar al profesor
                            $vms = $vmDao->getVirtualMachines(
                                    array('*'), array("codigo_laboratorio" => array('criteria' => '=', 'value' => $laboratorio['codigo_laboratorio']),
                                "codigo_perfil_vm" => array('criteria' => '=', 'value' => $perfil['codigo_perfil_vm']))
                            );
                            if (!empty($vms)) {
                                try {   //aca estoy asumiendo que las maquinas virtuales necesarias estan creadas
                                    foreach ($vms as $vm) {
                                        if (!($vmDaoAcademico->isUserVm($username, $vm['codigo_maquina_virtual']))) {
                                            $vmDao->insertMiembroAsociado($vm['codigo_maquina_virtual'], $username);
                                        }
                                    }
                                } catch (Exception $exc) {
                                    
                                }
                            } else {
                                //Crear la VM
                                $serviceOffering = $perfil['service_offering'];
                                $diskOffering = $perfil['disk_offering'];
                                $template = $perfil['template'];
                                $labName = str_replace(" ", "", strtolower($laboratorio["nombre"]));
                                $vmName = "vm-Prof-" . $labName . "-" . date("YmdHis");
                                for ($i = $cantidad_creada; $i < $gp['cantidad']; $i++) { //crear la cantidad necesaria de VMs
                                    try {
                                        $response = $vmRest->createVM($serviceOffering, $diskOffering, $vmName . "-" . $i, $template, $projectId);
                                        $response_array = Zend_Json_Decoder::decode($response);
                                        if (isset($response_array['deployvirtualmachineresponse']['errorcode'])) {
                                            $retval['response'] = "error";
                                            $retval['message'] = $response_array['deployvirtualmachineresponse']['errortext'];
                                            echo Zend_Json_Encoder::encode($retval);
                                            return;
                                        }
                                    } catch (Exception $exc) {
                                        $debugLog = Zend_Registry::get(VirtualLabs_Common::DEBUG_LOG);
                                        $debugLog->debug($exc->getMessage());
                                        $debugLog->debug($exc->getTraceAsString());
                                        $pos = strpos($exc->getMessage(), '10061');
                                        if ($pos) {
                                            $retval['response'] = "error";
                                            $retval['message'] = "no es posible conectarse al manager del cloud";
                                            echo Zend_Json_Encoder::encode($retval);
                                            return;
                                        }
                                    }
                                    //Guardamos la VM en la Base de datos
                                    $savedData = $vmDao->save(VirtualLabs_Admin_Machine::TABLE_NAME, array("codigo_laboratorio" => $codigoLaboratorio,
                                        "codigo_perfil_vm" => $perfil['codigo_perfil_vm'],
                                        "async_job_id" => $response_array['deployvirtualmachineresponse']['jobid'],
                                        "url" => "",
                                        "estado" => VirtualLabs_Admin_Machine::ESTADO_CREACION)
                                    );
                                    $codigo_maquina_virtual = end($savedData);
                                    //Asociamos la VM al usuario
                                    $vmDao->insertMiembroAsociado($codigo_maquina_virtual, $username);
                                }
                            }
                        }
                        $grupoPerfilDao->save(//Actualizamos la cantidad creada
                                VirtualLabs_Admin_GrupoPerfil::TABLE_NAME, array('cantidad_creada' => $gp['cantidad']), array('key' => 'codigo_grupo_perfil_vm', 'value' => $gp['codigo_grupo_perfil_vm'])
                        );
                    }
                    $retval['response'] = "success";
                    $retval['message'] = "M&aacute;quinas virtuales creadas y asociadas correctamente";
                } else {
                    $retval['response'] = "error";
                    $retval['message'] = "";
                }
            } else {
                $retval['response'] = "error";
                $retval['message'] = "La fecha actual no se encuentra en el periodo de validez del laboratorio.";
            }
        } catch (Exception $exc) {
            $debugLog = Zend_Registry::get(VirtualLabs_Common::DEBUG_LOG);
            $debugLog->debug($exc->getMessage());
            $debugLog->debug($exc->getTraceAsString());
            $retval['response'] = "error";
            $retval['message'] = $exc->getMessage();
        }
        echo Zend_Json_Encoder::encode($retval);
    }

}